
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufc.quixada.adrs.servlets;

import br.ufc.quixada.adrs.comandos.*;
import br.ufc.quixada.adrs.comandos.admin.*;
import br.ufc.quixada.adrs.comandos.adrs.*;
import br.ufc.quixada.adrs.comandos.supervisor.*;
import br.ufc.quixada.adrs.comandos.visit.*;
import br.ufc.quixada.adrs.interfaces.Comando;
import br.ufc.quixada.adrs.model.Perfil;
import java.io.IOException;
import java.util.HashMap;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;

/**
 *
 * @author fernando
 */
public class ServletCentral extends HttpServlet {

    private HashMap<String, Comando> comandos;

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        String cmd = request.getParameter("comando");
        Comando comando = (Comando) comandos.get(cmd);
        Perfil perfilUser = (Perfil) request.getSession().getAttribute("user");
        String perfilId = null;
        if (perfilUser != null && perfilUser.getId() != null) {
            perfilId = perfilUser.getId().toString();
        } else {
            perfilId = "Não logado";
        }
        try {
            String tela = comando.executa(request, response);
            if (tela != null && !tela.trim().equals("")) {
                response.sendRedirect(request.getContextPath() + tela);
                // Os 4 primeiros parametros da mensagem já são logados.
                // Incluindo como extra apenas o quinto (IP).
                MDC.put("IP", request.getRemoteAddr());
                Object[] paramArray = {perfilId, cmd, comando.getClass().getName(), tela, request.getRemoteAddr()};
                LoggerFactory.getLogger(this.getClass()).info("Perfil: {} | Chamada de entrada: {} | Comando ativado: {} | Chamada Saída: {} | IP: {}", paramArray);
            } else {
                response.sendRedirect(request.getContextPath() + "/index.jsp");
                MDC.put("IP", request.getRemoteAddr());
                Object[] paramArray = {perfilId, cmd, comando.getClass().getName(), tela, request.getRemoteAddr()};
                LoggerFactory.getLogger(this.getClass()).error("Retorno vazio do ServletCentral. Redirecionando para index. "
                        + "Perfil: {} | Chamada de entrada: {} | Comando ativado: {} | Chamada Saída: {} | IP: {}", paramArray);
            }
        } catch (Exception e) {
            response.sendRedirect(request.getContextPath() + "/index.jsp");
            MDC.put("Perfil", perfilId);
            MDC.put("Chamada de entrada", cmd);
            MDC.put("IP", request.getRemoteAddr());
            LoggerFactory.getLogger(this.getClass()).error("Exception na classe {}", this.getClass().getSimpleName(), e);
        }
    }

    @Override
    public void init() {
        Comando cmdo;
        comandos = new HashMap<String, Comando>();
        cmdo = new CmdAddQuestionarioQualitativo();
        comandos.put("CmdAdicionarQuestionarioQualitativo", cmdo);
        cmdo = new CmdLogin();
        comandos.put("CmdLogin", cmdo);
        cmdo = new CmdLogout();
        comandos.put("CmdLogout", cmdo);
        cmdo = new CmdAddAdrs();
        comandos.put("CmdAddAdrs", cmdo);
        cmdo = new CmdAddQuestionarioQuantitativo();
        comandos.put("CmdAddQuestionarioQuantitativo", cmdo);
        cmdo = new CmdAddVisita();
        comandos.put("CmdAddVisita", cmdo);
        cmdo = new CmdEditarQuestionarioQuantitativo();
        comandos.put("CmdEditarQuestionarioQuantitativo", cmdo);
        cmdo = new CmdAddQuestionarioQualitativo();
        comandos.put("CmdAddQuestionarioQualitativo", cmdo);
        cmdo = new CmdExcluirVisita();
        comandos.put("CmdExcluirVisita", cmdo);
        cmdo = new CmdListarProdutoresParaVisita();
        comandos.put("CmdListarProdutoresParaVisita", cmdo);
        cmdo = new CmdListarVisitasDoProdutor();
        comandos.put("CmdListarVisitasDoProdutor", cmdo);
        cmdo = new CmdVisualizarVisita();
        comandos.put("CmdVisualizarVisita", cmdo);
        cmdo = new CmdCarregaEstados();
        comandos.put("CmdCarregaEstados", cmdo);
        cmdo = new CmdBuscarProdutor();
        comandos.put("CmdBuscarProdutor", cmdo);
        cmdo = new CmdEditarAdrs();
        comandos.put("CmdEditarAdrs", cmdo);
        cmdo = new CmdVincularProdutor();
        comandos.put("CmdIncluirProdutor", cmdo);
        cmdo = new CmdCarregarListaAdrs();
        comandos.put("CmdCarregarListaAdrs", cmdo);
        cmdo = new CmdExcluirAdrs();
        comandos.put("CmdExcluirAdrs", cmdo);
        cmdo = new CmdCarregaAdrs();
        comandos.put("CmdCarregaAdrs", cmdo);
        cmdo = new CmdAdrsBuscarProdutor();
        comandos.put("CmdAdrsBuscarProdutor", cmdo);
        cmdo = new CmdAddQuestionarioSanitario();
        comandos.put("CmdAddQuestionarioSanitario", cmdo);
        cmdo = new CmdEditarQuestionarioSanitario();
        comandos.put("CmdEditarQuestionarioSanitario", cmdo);
        cmdo = new CmdEditarQuestionarioQualitativo();
        comandos.put("CmdEditarQuestionarioQualitativo", cmdo);
        cmdo = new CmdEditarVisita();
        comandos.put("CmdEditarVisita", cmdo);
        cmdo = new CmdExcluirQuestionarioQualitativo();
        comandos.put("CmdExcluirQuestionarioQualitativo", cmdo);
        cmdo = new CmdExcluirQuestionarioQuantitativo();
        comandos.put("CmdExcluirQuestionarioQuantitativo", cmdo);
        cmdo = new CmdExcluirQuestionarioSanitario();
        comandos.put("CmdExcluirQuestionarioSanitario", cmdo);
        cmdo = new CmdVisualizarAdrs();
        comandos.put("CmdVisualizarAdrs", cmdo);
        cmdo = new CmdRemoveAdrsSession();
        comandos.put("CmdRemoveAdrsSession", cmdo);
        cmdo = new CmdAddPrazo();
        comandos.put("CmdAddPrazo", cmdo);
        cmdo = new CmdListarPrazosAbertos();
        comandos.put("CmdListarPrazosAbertos", cmdo);
        cmdo = new CmdListarAdrsAtrasadosPrazo();
        comandos.put("CmdListarAdrsForaPrazo", cmdo);
        cmdo = new CmdListarProdutoresPedentes();
        comandos.put("CmdListarProdutoresPedentes", cmdo);
        cmdo = new CmdCarregaEnderecos();
        comandos.put("CmdCarregaEnderecos", cmdo);
        cmdo = new CmdListarPrazosAdrs();
        comandos.put("CmdListarPrazosAdrs", cmdo);
        cmdo = new CmdEditarPrazo();
        comandos.put("CmdEditarPrazo", cmdo);
        cmdo = new CmdRemoverPrazo();
        comandos.put("CmdRemoverPrazo", cmdo);
        cmdo = new CmdAdrsBuscarVisita();
        comandos.put("CmdAdrsBuscarVisita", cmdo);
        cmdo = new CmdBuscaAdrs();
        comandos.put("CmdBuscaAdrs", cmdo);
        cmdo = new CmdGerarPrazosAnuais();
        comandos.put("CmdGerarPrazosAnuais", cmdo);
        cmdo = new CmdListarProdutoreNaoVisitados();
        comandos.put("CmdListarProdutoreNaoVisitados", cmdo);
        cmdo = new CmdMontaRelatorioQtPassoUm();
        comandos.put("CmdMontaRelatorioQtPassoUm", cmdo);
        cmdo = new CmdMontaRelatorioQtPassoDois();
        comandos.put("CmdMontaRelatorioQtPassoDois", cmdo);
        cmdo = new CmdMontaRelatorioQtPassoTres();
        comandos.put("CmdMontaRelatorioQtPassoTres", cmdo);
        cmdo = new CmdAddProdutor();
        comandos.put("CmdAdicionarProdutor", cmdo);
        cmdo = new CmdListarProdutores();
        comandos.put("CmdListarProdutores", cmdo);
        cmdo = new CmdEditarProdutor();
        comandos.put("CmdEditarProdutor", cmdo);
        cmdo = new CmdCarregarEstadosProdutor();
        comandos.put("CmdCarregarEstadosProdutor", cmdo);
        cmdo = new CmdExcluirProdutor();
        comandos.put("CmdExcluirProdutor", cmdo);
        cmdo = new CmdAdrsAlterarCadastro();
        comandos.put("CmdAdrsAlterarCadastro", cmdo);
        cmdo = new CmdAdrsAlterarLogin();
        comandos.put("CmdAdrsAlterarLogin", cmdo);
        cmdo = new CmdAdminAlterarCadastro();
        comandos.put("CmdAdminAlterarCadastro", cmdo);
        cmdo = new CmdAdminAlterarLogin();
        comandos.put("CmdAdminAlterarLogin", cmdo);
        cmdo = new CmdVisualizarProdutor();
        comandos.put("CmdVisualizarProdutor", cmdo);
        cmdo = new CmdRecuperarSenha();
        comandos.put("CmdRecuperarSenha", cmdo);
        cmdo = new CmdAdminAddProdutor();
        comandos.put("CmdAdminAddProdutor", cmdo);
        cmdo = new CmdAdminEditarProdutor();
        comandos.put("CmdAdminEditarProdutor", cmdo);
        cmdo = new CmdAdminVisualizarProdutor();
        comandos.put("CmdAdminVisualizarProdutor", cmdo);
        cmdo = new CmdAdminVisualizarVisita();
        comandos.put("CmdAdminVisualizarVisita", cmdo);
        cmdo = new CmdListarAdrsIncluidosNoPrazo();
        comandos.put("CmdListarAdrsIncluidosNoPrazo", cmdo);
        cmdo = new CmdListarAdrsForaPrazo();
        comandos.put("CmdAddAdrsForaPrazo", cmdo);
        cmdo = new CmdAddAdrsPrazo();
        comandos.put("CmdAddAdrsPrazo", cmdo);
        cmdo = new CmdBuscarAdrsPorNomeForaPrazo();
        comandos.put("CmdAddAdrsPorNomePrazo", cmdo);
        cmdo = new CmdGrafico();
        comandos.put("CmdGrafico", cmdo);
        cmdo = new CmdEscolherAdrsRelatorio();
        comandos.put("CmdEscolherAdrsRelatorio", cmdo);
        cmdo = new CmdEscolherProdutorRelatorio();
        comandos.put("CmdEscolherProdutorRelatorio", cmdo);
        cmdo = new CmdListarTodosAdrsForaPrazos();
        comandos.put("CmdListarTodosAdrsForaPrazos", cmdo);
        cmdo = new CmdAddAdrsVariosPrazos();
        comandos.put("CmdAddAdrsVariosPrazos", cmdo);
        cmdo = new CmdListarTodosPrazos();
        comandos.put("CmdListarTodosPrazos", cmdo);
        cmdo = new CmdMontarRelatorioQtMovimentacao();
        comandos.put("CmdMontarRelatorioQtMovimentacao", cmdo);
        cmdo = new CmdMontarRelatorioQtRebanho();
        comandos.put("CmdmontarRelatorioQtRebanho", cmdo);
        cmdo = new CmdMontarRelatorioQtDescartes();
        comandos.put("CmdMontarRelatorioQtDescartes", cmdo);
        cmdo = new CmdMontaRelatorioPassoUm();
        comandos.put("CmdMontaRelatorioPassoUm", cmdo);
        cmdo = new CmdMontaRelatorioPassoDois();
        comandos.put("CmdMontaRelatorioPassoDois", cmdo);
        cmdo = new CmdMontaRelatorioPassoTres();
        comandos.put("CmdMontaRelatorioPassoTres", cmdo);
        cmdo = new CmdMontaRelatorioQSPassoQuatro();
        comandos.put("CmdMontaRelatorioQSPassoQuatro", cmdo);
        cmdo = new CmdVisualizarPrazosAntigos();
        comandos.put("CmdVisualizarPrazosAntigos", cmdo);
        cmdo = new CmdRelatorioProdutoresExcluidos();
        comandos.put("CmdRelatorioProdutoresExcluidos", cmdo);
        cmdo = new CmdListarAdrsLetraInicial();
        comandos.put("CmdListarAdrsLetraInicial", cmdo);
        cmdo = new CmdMontaRelatorioGrPassoUm();
        comandos.put("CmdMontaRelatorioGrPassoUm", cmdo);

        cmdo = new CmdVisitVisualizarVisita();
        comandos.put("CmdVisitVisualizarVisita", cmdo);
        cmdo = new CmdVisitBuscarProdutor();
        comandos.put("CmdVisitBuscarProdutor", cmdo);
        cmdo = new CmdVisitCarregarListaAdrs();
        comandos.put("CmdVisitCarregarListaAdrs", cmdo);
        cmdo = new CmdVisitVisualizarAdrs();
        comandos.put("CmdVisitVisualizarAdrs", cmdo);
        cmdo = new CmdVisitRemoveAdrsSession();
        comandos.put("CmdVisitRemoveAdrsSession", cmdo);
        cmdo = new CmdVisitListarPrazosAbertos();
        comandos.put("CmdVisitListarPrazosAbertos", cmdo);
        cmdo = new CmdVisitListarAdrsAtrasadosPrazo();
        comandos.put("CmdVisitListarAdrsForaPrazo", cmdo);
        cmdo = new CmdVisitListarProdutoresPedentes();
        comandos.put("CmdVisitListarProdutoresPedentes", cmdo);
        cmdo = new CmdVisitCarregaEnderecos();
        comandos.put("CmdVisitCarregaEnderecos", cmdo);
        cmdo = new CmdVisitMontaRelatorioQtPassoUm();
        comandos.put("CmdVisitMontaRelatorioQtPassoUm", cmdo);
        cmdo = new CmdVisitMontaRelatorioQtPassoDois();
        comandos.put("CmdVisitMontaRelatorioQtPassoDois", cmdo);
        cmdo = new CmdVisitMontaRelatorioQtPassoTres();
        comandos.put("CmdVisitMontaRelatorioQtPassoTres", cmdo);
        cmdo = new CmdVisitAlterarCadastro();
        comandos.put("CmdVisitAlterarCadastro", cmdo);
        cmdo = new CmdVisitAlterarLogin();
        comandos.put("CmdVisitAlterarLogin", cmdo);
        cmdo = new CmdVisitVisualizarProdutor();
        comandos.put("CmdVisitVisualizarProdutor", cmdo);
        cmdo = new CmdVisitListarAdrsIncluidosNoPrazo();
        comandos.put("CmdVisitListarAdrsIncluidosNoPrazo", cmdo);
        cmdo = new CmdVisitEscolherAdrsRelatorio();
        comandos.put("CmdVisitEscolherAdrsRelatorio", cmdo);
        cmdo = new CmdVisitEscolherProdutorRelatorio();
        comandos.put("CmdVisitEscolherProdutorRelatorio", cmdo);
        cmdo = new CmdVisitListarTodosPrazos();
        comandos.put("CmdVisitListarTodosPrazos", cmdo);
        cmdo = new CmdVisitMontarRelatorioQtMovimentacao();
        comandos.put("CmdVisitMontarRelatorioQtMovimentacao", cmdo);
        cmdo = new CmdVisitMontarRelatorioQtRebanho();
        comandos.put("CmdVisitMontarRelatorioQtRebanho", cmdo);
        cmdo = new CmdVisitMontarRelatorioQtDescartes();
        comandos.put("CmdVisitMontarRelatorioQtDescartes", cmdo);
        cmdo = new CmdVisitMontaRelatorioPassoUm();
        comandos.put("CmdVisitMontaRelatorioPassoUm", cmdo);
        cmdo = new CmdVisitMontaRelatorioPassoDois();
        comandos.put("CmdVisitMontaRelatorioPassoDois", cmdo);
        cmdo = new CmdVisitMontaRelatorioPassoTres();
        comandos.put("CmdVisitMontaRelatorioPassoTres", cmdo);
        cmdo = new CmdVisitMontaRelatorioQSPassoQuatro();
        comandos.put("CmdVisitMontaRelatorioQSPassoQuatro", cmdo);
        cmdo = new CmdVisitVisualizarPrazosAntigos();
        comandos.put("CmdVisitVisualizarPrazosAntigos", cmdo);
        cmdo = new CmdVisitRelatorioProdutoresExcluidos();
        comandos.put("CmdVisitRelatorioProdutoresExcluidos", cmdo);
        cmdo = new CmdVisitListarAdrsLetraInicial();
        comandos.put("CmdVisitListarAdrsLetraInicial", cmdo);
        cmdo = new CmdVisitMontaRelatorioGrPassoUm();
        comandos.put("CmdVisitMontaRelatorioGrPassoUm", cmdo);
        cmdo = new CmdCarregaAdrsPrazo();
        comandos.put("CmdCarregaAdrsPrazo", cmdo);
        cmdo = new CmdListarConfirmacoes();
        comandos.put("CmdListarConfirmacoes", cmdo);
        cmdo = new CmdVisitListarConfirmacoes();
        comandos.put("CmdVisitListarConfirmacoes", cmdo);
        cmdo = new CmdAlterarConfirmacaoPrazo();
        comandos.put("CmdAlterarConfirmacaoPrazo", cmdo);
        cmdo = new CmdCarregarProdutoresExcluidos();
        comandos.put("CmdCarregarProdutoresExcluidos", cmdo);
        cmdo = new CmdReativarProdutor();
        comandos.put("CmdReativarProdutor", cmdo);
        cmdo = new CmdAddAdministrador();
        comandos.put("CmdAddAdministrador", cmdo);
        cmdo = new CmdListarAdministradores();
        comandos.put("CmdListarAdministradores", cmdo);
        cmdo = new CmdCarregarEstadosSupervisor();
        comandos.put("CmdCarregarEstadosSupervisor", cmdo);
        cmdo = new CmdVisualizarAdministrador();
        comandos.put("CmdVisualizarAdministrador", cmdo);
        cmdo = new CmdAlterarAdministrador();
        comandos.put("CmdAlterarAdministrador", cmdo);
        cmdo = new CmdExcluirAdministrador();
        comandos.put("CmdExcluirAdministrador", cmdo);
        cmdo = new CmdSupervisorAlterarLogin();
        comandos.put("CmdSupervisorAlterarLogin", cmdo);
        cmdo = new CmdSupervisorAlterarCadastro();
        comandos.put("CmdSupervisorAlterarCadastro", cmdo);
        cmdo = new CmdJustificarExclusaoProdutor();
        comandos.put("CmdJustificarExclusaoProdutor", cmdo);
        cmdo = new CmdMontaRelatorioQSProdutoresPorDoencas();
        comandos.put("CmdMontaRelatorioQSProdutoresPorDoencas", cmdo);
        cmdo = new CmdMontaRelatorioQLPassoQuatro();
        comandos.put("CmdMontaRelatorioQLPassoQuatro", cmdo);
        cmdo = new CmdRelatorioProdutoresPorMovimentacoes();
        comandos.put("CmdRelatorioProdutoresPorMovimentacoes", cmdo);
        cmdo = new CmdCarregarAdminsExcluidos();
        comandos.put("CmdCarregarAdminsExcluidos", cmdo);
        cmdo = new CmdReativarAdmin();
        comandos.put("CmdReativarAdmin", cmdo);
        cmdo = new CmdCarregarAdrssExcluidos();
        comandos.put("CmdCarregarAdrssExcluidos", cmdo);
        cmdo = new CmdReativarAdrs();
        comandos.put("CmdReativarAdrs", cmdo);
        cmdo = new CmdVisitMontaRelatorioQSProdutoresPorDoencas();
        comandos.put("CmdVisitMontaRelatorioQSProdutoresPorDoencas", cmdo);
        cmdo = new CmdVisitRelatorioProdutoresPorMovimentacoes();
        comandos.put("CmdVisitRelatorioProdutoresPorMovimentacoes", cmdo);
        cmdo = new CmdMontaRelatorioQlPassoCinco();
        comandos.put("CmdMontaRelatorioQlPassoCinco", cmdo);
        cmdo = new CmdVisitMontaRelatorioQLPassoQuatro();
        comandos.put("CmdVisitMontaRelatorioQLPassoQuatro", cmdo);
        cmdo = new CmdVisitMontaRelatorioQlPassoCinco();
        comandos.put("CmdVisitMontaRelatorioQlPassoCinco", cmdo);
        cmdo = new CmdExcluirProdutoresDoAdrs();
        comandos.put("CmdExcluirProdutoresDoAdrs", cmdo);
        cmdo = new CmdTransferirProdutoresDoAdrs();
        comandos.put("CmdTransferirProdutoresDoAdrs", cmdo);
        cmdo = new CmdBuscarProdutorPorCPF();
        comandos.put("CmdBuscarProdutorPorCPF", cmdo);
        cmdo = new CmdBuscarProdutoresPorLocalidade();
        comandos.put("CmdBuscarProdutoresPorLocalidade", cmdo);
        cmdo = new CmdRelatorioProdutoresDividosPorAdrs();
        comandos.put("CmdRelatorioProdutoresDividosPorAdrs", cmdo);
        cmdo = new CmdVisitRelatorioProdutoresDividosPorAdrs();
        comandos.put("CmdVisitRelatorioProdutoresDividosPorAdrs", cmdo);
        cmdo = new CmdCarregaAdrssParaTransferenciaDeProdutores();
        comandos.put("CmdCarregaAdrssParaTransferenciaDeProdutores", cmdo);
    }
// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">

    /**
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);


    }

    /**
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);


    }

    /**
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";

    }// </editor-fold>
}
